import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author xhw
 */

public class DataTable {
    //这个类是一个数据表，包含了表头数据（属性数据）和行数据
    //属性数据是一个List<String>，行数据是一个List<DataRow>

    private final List<String> columns;
    private final List<DataRow> rows;

    public DataTable() {
        this.columns = new ArrayList<>();
        this.rows = new ArrayList<>();
    }

    //实现的方法一个有：获取属性行（表头），获取行数据，添加列名，添加一行数据
    //获取数据列的数量
    public int getRowCount() {
        return rows.size();
    }

    //获取属性行（要设置为不可修改的视图）
    public List<String> getColumns() {
        return Collections.unmodifiableList(columns);
    }

    //获取所有的行数据
    public List<DataRow> getRows() {
        return new ArrayList<>(rows);
    }

    //添加列名
    public void addColumns(String[] columns) {
        this.columns.addAll(List.of(columns));
    }

    //添加一行数据
    public void addRow(String[] values) {
        MapRow row = createMapRow(values);
        rows.add(row);
    }

    //添加一行数据
    public void addRow(List<String> values) {
        MapRow row = createMapRow(values.toArray(new String[0]));
        rows.add(row);
    }

    //创建一个MapRow对象
    private MapRow createMapRow(String[] values) {
        //先判断属性行是否为空之后判断是否长度适合之后直接设置值
        if (columns.isEmpty()) {
            throw new IllegalStateException("列不能为空");
        }
        if (columns.size() != values.length) {
            throw new IllegalStateException("列长度不匹配");
        }
        MapRow row = new MapRow();
        for (int i = 0; i < columns.size(); i++) {
            row.setValue(columns.get(i), values[i]);
        }
        return row;
    }

    public DataGroups groupBy(List<String> rowKeys, List<String> columnKeys) {
        DataGroups groups = new DataGroups(rowKeys, columnKeys);
        for (DataRow row : rows) {
            groups.addDataRow(row);
        }
        return groups;
    }
}
